<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title></title>
	<script type="text/javascript">
		//Object.assign({},func1,func2,)
		//合并对象
		//相同的合并，不同而并存
		var b = {
			'b': '1'
		}
		console.log(b)
		//复制一个对象

		var obj = {
			a: 1
		};
		var copy = Object.assign({}, obj);
		console.log(copy); // { a: 1 }

		//深拷贝问题

		// 针对深拷贝， 需要使用其他方法， 因为 Object.assign() 拷贝的是属性值。 假如源对象的属性值是一个指向对象的引用， 它也只拷贝那个引用值。

		function test() {
			'use strict';

			let obj1 = {
				a: 0,
				b: {
					c: 0
				}
			};
			let obj2 = Object.assign({}, obj1);
			console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}

			obj1.a = 1;
			console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
			console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}

			obj2.a = 2;
			console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
			console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}

			obj2.b.c = 3;
			console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
			console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}

			// Deep Clone
			obj1 = {
				a: 0,
				b: {
					c: 0
				}
			};
			let obj3 = JSON.parse(JSON.stringify(obj1));
			obj1.a = 4;
			obj1.b.c = 4;
			console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
		}

		test();

		// 合并对象

		var o1 = {
			a: 1
		};
		var o2 = {
			b: 2
		};
		var o3 = {
			c: 3
		};

		var obj = Object.assign(o1, o2, o3);
		console.log(obj); // { a: 1, b: 2, c: 3 }
		console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。

		// 合并具有相同属性的对象

		var o1 = {
			a: 1,
			b: 1,
			c: 1
		};
		var o2 = {
			b: 2,
			c: 2
		};
		var o3 = {
			c: 3
		};

		var obj = Object.assign({}, o1, o2, o3);
		console.log(obj); // { a: 1, b: 2, c: 3 }

		// 属性被后续参数中具有相同属性的其他对象覆盖。
		// 拷贝 symbol 类型的属性

		var o1 = {
			a: 1
		};
		var o2 = {
			[Symbol('foo')]: 2
		};

		var obj = Object.assign({}, o1, o2);
		console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox)
		Object.getOwnPropertySymbols(obj); // [Symbol(foo)]

		// 继承属性和不可枚举属性是不能拷贝的

		var obj = Object.create({
			foo: 1
		}, { // foo 是个继承属性。
			bar: {
				value: 2 // bar 是个不可枚举属性。
			},
			baz: {
				value: 3,
				enumerable: true // baz 是个自身可枚举属性。
			}
		});

		var copy = Object.assign({}, obj);
		console.log(copy); // { baz: 3 }
	</script>
</head>

<body>
</body>

</html>